查看原文
其他

基于感知损失的实时风格迁移与超分辨率重建

gloomyfish OpenCV学堂 2020-02-04

点击上方↑↑↑“OpenCV学堂”关注我

OpenCV4 系统化学习,加入 OpenCV研习社 即可

方法概述

许多经典的图像问题都可以被看成是图像变换任务,算法接受一个输入图像,然后输出变换之后的图像。最常见的例子就是图像处理中的取噪、超分辨重建、图像彩色化等问题,输入的图像是退化低质量图像(噪声、低分辨率、灰度化)得到的输出是一个彩色、高分辨率、高质量的图像,此外这类变换还包括图像语义分割、深度评估。以前基于卷积神经网络来解决这类问题通常采用的是像素基本的损失,但是这种方法训练得到模型拟合标注数据与输出结果之后的感知不同,作者正是基于这点提出了基于感知的损失来训练纠正这种偏差。

像素基本损失

在像素基本对比两幅图像、如果两幅图像感知相同,但是像素不同,像素损失就会造成很大偏差。

感知损失

基于高阶卷积神经网络特征实现感知比较,不做像素基本的损失。


 

作者基于感知损失实验了两个图像处理任务,均取得了比较好的效果

图像风格迁移任务
图像超分辨


 

显示如下:

模型架构

模型主要分为两个部分,图像变换网络与感知损失网络,其中损失网络在训练过程种保持不变,主要是采用预训练的图像分类网络如VGG16。定义感知损失来分别度量风格与内容的感知不同,实现最优化得到训练模型。相关的损失表示如下:

出了上述损失之外,作者还定义了两个低阶的损失,一个是简单的像素损失,另外一个是全变分正则化损失。

实验结果

风格迁移的实验结果

超分辨实验结果

 

源码下载地址:

https://github.com/jcjohnson/fast-neural-style


预训练模型下载

bash models/download_style_transfer_models.sh


OpenCV DNN使用预训练模型输出结果:


演示代码:

inWidth = 256
inHeight = 256
h, w = frame.shape[:2]
inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),
                          (103.939116.779123.68), swapRB=False, crop=False)

# 执行风格迁移
net.setInput(inp)
out = net.forward()
print(out.shape)
t, _ = net.getPerfProfile()
freq = cv.getTickFrequency() / 1000
label = "FPS : %.2f" % (1000 / (t / freq))

# 解析输出
out = out.reshape(3out.shape[2], out.shape[3])
print("ddddddddd"out.shape)
out[0] += 103.939
out[1] += 116.779
out[2] += 123.68
out /= 255.0
out = out.transpose(120)
print("new shape"out.shape)
out = np.clip(out0.01.0)

# rescale与中值模糊,消除极值点噪声
cv.normalize(outout0255, cv.NORM_MINMAX)
out = cv.medianBlur(out5)

# resize and show
result = np.uint8(cv.resize(out, (w, h)))
cv.putText(result, label, (525), cv.FONT_HERSHEY_SIMPLEX, 0.75, (00255), 2)
cv.imshow('Fast Style Demo', result)
cv.imwrite("D:/result_%d.png"%index, result)

往期精选

告诉大家你 在看

扫码加入OpenCV研习社

系统化学习OpenCV4,解锁更多技能!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存